package com.menqui.localizame.Gps;

import java.net.URLEncoder;
import java.util.List;

import android.location.Location;
import android.os.Handler;
import android.util.Log;

import com.menqui.localizame.Threads.GpsThread;
import com.menqui.localizame.constantes.ConstantesConfiguracion;
import com.menqui.localizame.estructuras.DatosRuta;
import com.menqui.localizame.webservice.LocalizameWebService;

public class GpsWebService {
	public static final String __RESPONSE_KEY__ = "";

	private String LOG_TAG = getClass().toString();

	private DatosRuta datosRuta = null;
	private GpsPantalla pantalla;
	private Integer contador = 0;
	private GpsFichero fichero = null;
	private Integer datosPorEnviar = 0;
	private Integer datosEnviados = 0;
	private Integer datosTotales = 0;

	Handler myHandler = new Handler() {
		@Override
		public void handleMessage(android.os.Message msg) {
			if (msg.what == 0) {

			 	String response = msg.getData().getString(__RESPONSE_KEY__);
			 	if (datosRuta.getIdRuta() <= 0) {
			 		String[] identificadores = response.split(";");
			 		datosRuta.setIdRuta(Long.parseLong(identificadores[0]));
			 		datosRuta.setIdTramo(Long.parseLong(identificadores[1]));
			 	}
				datosTotales += datosEnviados;
				pantalla.setEtiqueta("Paquetes:" + contador + "    Localizaciones: " + datosEnviados + "   Totales: " + datosTotales);
				fichero.actualizarIndice(datosEnviados);
				datosEnviados = 0;
				contador ++;
			}
			if (msg.what == 1) {

			}
		};
	};


	public GpsWebService(GpsPantalla pantalla, GpsFichero fichero) {
		this.pantalla = pantalla;
		this.fichero = fichero;
	}

	public void setLocation(Location location) {
		datosPorEnviar ++;

		if (datosPorEnviar > 30) {
			procesarVector();
			datosPorEnviar = 0;
		}
	}

	private void procesarVector() {
		if (datosRuta.getIdRuta() > 0L) {
			String url = generarRuta(datosRuta);
			List<Location> listaLocations = fichero.getLastLocations();
			
			Location primeraLocalizacion = listaLocations.get(0);
			Location ultimaLocalizacion = listaLocations.get(listaLocations.size() - 1);
			float distancia = primeraLocalizacion.distanceTo(ultimaLocalizacion);
			url += ";" + distancia;
			
			 for(Location iterLocation: listaLocations) {
					url += anadirLongitudLatitud(iterLocation);
			 }
			 datosEnviados = listaLocations.size();
			 enviarDatosWS(url);

		}
	}

	public String anadirLongitudLatitud(Location iterLocation) {
		return ";" + iterLocation.getLongitude() + ";" + iterLocation.getLatitude();
	}

	private void enviarDatosWS(String url) {
		Log.d(LOG_TAG, "--> " + url);
		GpsThread gpsThread = new GpsThread(myHandler, url);
		gpsThread.run();
	}

	private String generarRuta(DatosRuta datosRuta) {
		return ConstantesConfiguracion.URL_SERVIDOR + "addTracks?datos=" + datosRuta.getUsuario() + ";"
				+ datosRuta.getIdRuta()	+ ";"
				+ URLEncoder.encode(datosRuta.getNombreRuta()) + ";"
				+ datosRuta.getIdTramo() + ";"
				+ datosRuta.getFechaInicio().getTime() + ";";
	}

	public void startRuta(Location location, DatosRuta datosRuta) {
		String cadena = generarRuta(datosRuta);
		
		// Distancia inicial == 0
		cadena += ";0";
		if (location != null){
			cadena += anadirLongitudLatitud(location);
		}
		
		enviarDatosWS(cadena);
		this.datosRuta = datosRuta;
	}

	public String addComentario(String idRuta, String comentario, Location location) {
		String url = ConstantesConfiguracion.URL_SERVIDOR + "addComentario?datos=" + idRuta + ";" + location.getTime() + ";" +
				location.getLongitude() + ";" + location.getLatitude() + ";" + URLEncoder.encode(comentario);
		Log.w(LOG_TAG, "Envia comentario: " + url);

		String resultado = LocalizameWebService.procesarSolicitudWebservice(url);

		return resultado;
	}

}
